/*
 * xloginsert.h
 *
 * 生成 WAL 记录的函数
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/xloginsert.h
 */
#ifndef XLOGINSERT_H
#define XLOGINSERT_H

#include "access/rmgr.h"
#include "access/xlogdefs.h"
#include "storage/block.h"
#include "storage/buf.h"
#include "storage/relfilenode.h"
#include "utils/relcache.h"

/*
 * WAL构造工作区的最小大小。如果您需要
 * 注册超过XLR_NORMAL_MAX_BLOCK_ID的块引用或在单个WAL记录中有超过
 * XLR_NORMAL_RDATAS的数据块，您必须先调用
 * XLogEnsureRecordSpace()以分配更多工作内存。
 */
#define XLR_NORMAL_MAX_BLOCK_ID		4
#define XLR_NORMAL_RDATAS			20

/* XLogRegisterBuffer的标志 */
#define REGBUF_FORCE_IMAGE	0x01	/* 强制完整页面图像 */
#define REGBUF_NO_IMAGE		0x02	/* 不要获取完整页面图像 */
#define REGBUF_WILL_INIT	(0x04 | 0x02)	/* 页面将在重放时重新初始化
											 * （意味着无图像） */
#define REGBUF_STANDARD		0x08	/* 页面遵循“标准”页面布局，
									 * （pd_lower和pd_upper之间的数据将被跳过） */
#define REGBUF_KEEP_DATA	0x10	/* 即使获取完整页面图像也包括数据
									 * */

/* xloginsert.c中公共函数的原型： */
extern void XLogBeginInsert(void);
extern void XLogSetRecordFlags(uint8 flags);
extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info);
extern void XLogEnsureRecordSpace(int max_block_id, int ndatas);
extern void XLogRegisterData(char *data, int len);
extern void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags);
extern void XLogRegisterBlock(uint8 block_id, RelFileNode *rnode,
							  ForkNumber forknum, BlockNumber blknum, char *page,
							  uint8 flags);
extern void XLogRegisterBufData(uint8 block_id, char *data, int len);
extern void XLogResetInsertion(void);
extern bool XLogCheckBufferNeedsBackup(Buffer buffer);

extern XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum,
							  BlockNumber blk, char *page, bool page_std);
extern void log_newpages(RelFileNode *rnode, ForkNumber forkNum, int num_pages,
						 BlockNumber *blknos, char **pages, bool page_std);
extern XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std);
extern void log_newpage_range(Relation rel, ForkNumber forkNum,
							  BlockNumber startblk, BlockNumber endblk, bool page_std);
extern XLogRecPtr XLogSaveBufferForHint(Buffer buffer, bool buffer_std);

extern void InitXLogInsert(void);

#endif							/* XLOGINSERT_H */
